package com.walter.learn.computingTextSimilarity;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * @ProjectName: learn
 * @Package: com.walter.learn.computingTextSimilarity
 * @ClassName: JaccardSimilarity
 * @Author: DELL
 * @Description: Jaccard算法计算相似度
 * @Date: 2019/8/26 15:24
 * @Version: 1.0
 */
public class JaccardSimilarity {
    /**
     * @Description 利用Jaccard算法去求文本相似度
     * @Param s1, s2 要比较的文本内容
     * @Create 2019/8/26 15:26
     * @Author wangzheng
     * @Return 相似度
     */
    public static float getSimilarity(String str1, String str2) {
        Set<Character> s1 = new HashSet<>();//set元素不可重复
        Set<Character> s2 = new HashSet<>();

        for (int i = 0; i < str1.length(); i++) {
            s1.add(str1.charAt(i));//将string里面的元素一个一个按索引放进set集合
        }
        for (int j = 0; j < str2.length(); j++) {
            s2.add(str2.charAt(j));
        }

        float mergeNum = 0;//并集元素个数
        float commonNum = 0;//相同元素个数（交集）

        for (Character ch1 : s1) {
            for (Character ch2 : s2) {
                if (ch1.equals(ch2)) {
                    commonNum++;
                }
            }
        }

        mergeNum = s1.size() + s2.size() - commonNum;
        float jaccard = commonNum / mergeNum;
        return jaccard;
    }
}
